package juego;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Explorador extends Vehiculo {
	
	//Atributos de clase
	private static double miArco = ((2*(Math.PI))/20);
	private static int miImpacto = 15;
	private static int miPuntajePorDestruccion = 50;
	private static int miRadioGiro = /*30;*/20;
	private static int miResistenciaMaxima = 6;
	private static int miTamanio = 15;//5
	private static int miVelocidad = 10;
	
	//Atributos de instancia
    private Coordenada centro;
    private double angulo;
    
    //metodos
    
    //Constructor recibe coordenada
    public Explorador(Coordenada ubicacion){
    	super(ubicacion, miResistenciaMaxima);
    	int x = ubicacion.obtenerCoordenadaX();
    	int y = ubicacion.obtenerCoordenadaY();
    	int centroEnY = (y - miRadioGiro);
    	this.centro = new Coordenada(x,centroEnY);
    };
    
    //Constructor recibe 2 enteros
    public Explorador(int x, int y){
    	super(new Coordenada(x,y), miResistenciaMaxima);
    	int centroEnY = (y - miRadioGiro);
    	this.centro = new Coordenada(x,centroEnY);
    };
    
        
  //Devuelve el impacto provocado
    @Override
	public Impacto impactoProvocado(){
		return new ImpactoLineal(miImpacto);
	};  
    
    //Devuelve el puntaje por haber sido destruido
    public int puntajePorDestruccion(){
    	return miPuntajePorDestruccion;
    };

    
    //Devuelve el tamanio del explorador
    public int verTamanio(){
	    return miTamanio;
    };
    
  //Devuelve la velocidad del explorador
    protected int velocidad(){
	    return miVelocidad;
    };
    
    //se encarga de realizar el movimiento
    protected void movimientoPropio(){
    	this.angulo = this.angulo + miArco;
    	int enX = (int)((miRadioGiro)*Math.sin(angulo)); 
        int enY = (int)((miRadioGiro)*Math.cos(angulo)); 
    	int coordenadaX = this.centro.obtenerCoordenadaX() + enX;
    	int coordenadaY = this.centro.obtenerCoordenadaY() + enY;
    	Coordenada otraCoordenada = new Coordenada(coordenadaX,coordenadaY);
    	this.ubicacion = otraCoordenada;
    }

	@Override
	public Element getElement(Document doc) {
	
		Element nave = doc.createElement("Explorador");
		
		Double valorAngulo = new Double(this.angulo);
		Element angulo = doc.createElement("Angulo");
		nave.appendChild(angulo);
		angulo.setTextContent(valorAngulo.toString());
		
		Element centro = doc.createElement("Centro");
		centro.appendChild(this.centro.getElement(doc));
		nave.appendChild(centro);
		
		this.persistirVehiculo(doc, nave);
	
		return nave;
	};
	
    public static Explorador fromElement(Element element) {
		Explorador nave = new Explorador(-1,-1);
		Vehiculo.recuperarVehiculo(element,nave);
		recuperarPropios(element,nave);
			
		return nave;
	}
    
    private static void recuperarPropios(Element element, Explorador explorador) {
		NodeList childs = element.getChildNodes();
		for (int i = 0; i < childs.getLength(); i++) {
			Node child = childs.item(i);
			if (child.getNodeName().equals("Angulo")) {
				explorador.angulo = Double.parseDouble(child.getTextContent());
			}
			else if (child.getNodeName().equals("Centro")) {
				//obtengo a su vez la lista de hijos de este nodo
				NodeList listaNietos = child.getChildNodes();
				for (int j = 0; j < listaNietos.getLength();j++) {
					Node nieto = listaNietos.item(j);
					if (nieto.getNodeName().equals("Coordenada")) {
						explorador.centro = Coordenada.fromElement((Element) nieto);
					}
				}
			}
		}
	}
    


}
